package com.lishem.carl._07tree;

import com.lishem.common.TreeNode;

/**
 * https://leetcode.cn/problems/count-complete-tree-nodes/description/
 * <p>
 * 给你一棵 完全二叉树 的根节点 root ，求出该树的节点个数。
 * <p>
 * 完全二叉树 的定义如下：在完全二叉树中，除了最底层节点可能没填满外，其余每层节点数都达到最大值，
 * <p>
 * 并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层，则该层包含 1~ 2h 个节点。
 */
public class _16LetCode222_完全二叉树的节点个数 {

    public int countNodes(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int leftDepth = getDepth(root.left);
        int rightDepth = getDepth(root.right);
        if (leftDepth == rightDepth) {
            return (1 << leftDepth) - 1 + 1 + countNodes(root.right);
        } else {
            return (1 << rightDepth) - 1 + 1 + countNodes(root.left);
        }
    }

    private int getDepth(TreeNode root) {
        int count = 0;
        while (root != null) {
            count++;
            root = root.left;
        }
        return count;
    }
}
